package cn.com.action;

import cn.com.dao.StuDao;
import cn.com.utils.PageBean;
import cn.com.view.StuFrame;
import cn.com.vo.StuVo;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;

/**
 * @author ：khc
 * @date ：Created in 2021/12/21 16:25
 * @description：处理学生信息
 * @modified By：
 * @version: $
 */
public class StuAction implements ActionListener {
    //定义桌面面板
    private JDesktopPane jDesktopPane;
    //定义内嵌框架  类似于JFrame框架
    private JInternalFrame jInternalFrame;
    //定义添加、删除按钮
    private JButton addStu,delStu;
    //定义JTable 显示学生信息的
    private JTable jTable;
    //创建Model 存储数据
    private DefaultTableModel model;
    //创建分页标签 1:当前页码  2：每页显示条数 3最大页码 4总记录数
    private JLabel curPage,rowsPrePage,maxPage,maxCount;
    //定义分页工具类
    private PageBean pageBean;
    //定义操作数据库的处理类
    private StuDao stuDao;
    //定义对话框，以模式窗体的方式显示
    private JDialog jDialog;
    //定义学生操作界面对像
    private StuFrame stuFrame;
    //定义选择表格的对像
    private ListSelectionModel sModel;
    //存储选中的行数据
    private int rows[];

    public StuAction(JDesktopPane jDesktopPane){
        this.jDesktopPane = jDesktopPane;
        //实例化model 存储数据的
        model = new DefaultTableModel(){
            //是否允许编辑表格
            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        //实例化jTable
        jTable = new JTable(model);
        jTable.setToolTipText("双击可进行修改");
        //获取表格的选择对像
        sModel = jTable.getSelectionModel();
        //注册选择事件
        sModel.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                //当选择表格中的数据时，把当前选择的行数据设置给rows对像
                rows = jTable.getSelectedRows();
            }
        });
        //注册表格的双击事件
        jTable.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if(e.getClickCount() == 2){//双击
                    updateStu();
                }
            }
        });

        //实例化分页标签
        curPage = new JLabel();
        rowsPrePage = new JLabel();
        maxCount = new JLabel();
        maxPage = new JLabel();
        //实例化stuDao
        stuDao = new StuDao();
    }
    //修改学生信息
    private void updateStu(){
        //构造对话框，以模式窗体的方式显示
        jDialog = new JDialog(new JFrame(),true);
        //设置参数
        jDialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        jDialog.setSize(250,300);
        jDialog.setLocationRelativeTo(null);
        //实例化学生操作对像
        stuFrame = new StuFrame();
        //修改界面的title
        stuFrame.getPanel().setBorder(BorderFactory.createTitledBorder("修改学生信息"));
        //设置学生操作界面按钮的名字
        stuFrame.getConfirm().setText("修改");
        stuFrame.getConfirm().setActionCommand("update");
        //注册按钮事件
        stuFrame.getConfirm().addActionListener(this);
        //把当前选择的表格行数据显示在修改界面上
        stuFrame.getStuname().setText(jTable.getValueAt(rows[0],1).toString());
        stuFrame.getStuage().setText(jTable.getValueAt(rows[0],2).toString());
        stuFrame.getStuphone().setText(jTable.getValueAt(rows[0],3).toString());
        stuFrame.getStuaddress().setText(jTable.getValueAt(rows[0],4).toString());
        //添加学生操作界面
        jDialog.getContentPane().add(stuFrame.getPanel());

        //显示
        jDialog.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取按钮的名字
        String command = e.getActionCommand();
        //检查点击了哪个按钮
        if("showStu".equalsIgnoreCase(command)){
            //显示学生信息操作主界面
            showStu();
        }else if("first".equalsIgnoreCase(command)){
            queryData(1);
        }else if("previous".equalsIgnoreCase(command)){
            queryData(Integer.parseInt(curPage.getText())-1);
        }else if("next".equalsIgnoreCase(command)){
            queryData(Integer.parseInt(curPage.getText())+1);
        }else if("last".equalsIgnoreCase(command)){
            queryData(Integer.parseInt(maxPage.getText()));
        }else if("addStu".equalsIgnoreCase(command)){
            //打开学生操作界面，用来添加学生信息
            addStu();

        }else if("update".equalsIgnoreCase(command)){
            update();//修改数据
        }else if("delStu".equalsIgnoreCase(command)){
            delStu();//删除
        }else if("add".equalsIgnoreCase(command)){
            add();//获取界面数据，添加到数据库
        }
    }
    //删除指定的学生信息
    private void delStu(){
        int row = jTable.getSelectedRow();
        //检查是否选择了数据
        if(row<0){
            JOptionPane.showMessageDialog(null,"请选择要删除的数据!");
            return;
        }//提示
        if( JOptionPane.showConfirmDialog( null, "确认要删除当前选择的数据吗?","删除",JOptionPane.YES_NO_OPTION)!= 0 ){
            return;
        }
        String msg = "";
        //获取学生的学号
        if(stuDao.delStu(Integer.parseInt(jTable.getValueAt(rows[0],0).toString()))>0){
            msg = "数据删除成功!";
            //刷新表格
            queryData(Integer.parseInt(curPage.getText()));
        }else{
            msg = "数据删除失败!";
        }
        JOptionPane.showMessageDialog(null,msg);
    }
    //修改数据
    private void update(){
        //创建vo类，封装界面上的数据
        StuVo vo = new StuVo();
        vo.setStuid(Integer.parseInt(jTable.getValueAt(rows[0],0).toString()));
        vo.setName(stuFrame.getStuname().getText());
        vo.setAge(Integer.parseInt(stuFrame.getStuage().getText()));
        vo.setPhone(stuFrame.getStuphone().getText());
        vo.setAddress(stuFrame.getStuaddress().getText());
        String msg = "";
        if(stuDao.updateStu(vo)>0){//成功
            msg = "数据修改成功!";
            queryData(Integer.parseInt(curPage.getText()));
            //关闭界面
            jDialog.dispose();
        }else{
            msg = "数据修改失败!";
        }
        JOptionPane.showMessageDialog(null,msg);

    }
    //添加数据到数据库中
    private void add(){
        //创建vo类，封装界面上的数据
        StuVo vo = new StuVo();
        vo.setName(stuFrame.getStuname().getText());
        vo.setAge(Integer.parseInt(stuFrame.getStuage().getText()));
        vo.setPhone(stuFrame.getStuphone().getText());
        vo.setAddress(stuFrame.getStuaddress().getText());
        String msg = "";
        if(stuDao.addStu(vo)>0){//成功
            msg = "数据添加成功!";
            queryData(Integer.parseInt(curPage.getText()));
            //关闭界面
            jDialog.dispose();
        }else{
            msg = "数据添加失败!";
        }
        JOptionPane.showMessageDialog(null,msg);
    }
    //添加学生信息
    private void addStu(){
        //构造对话框，以模式窗体的方式显示
        jDialog = new JDialog(new JFrame(),true);
        //设置参数
        jDialog.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        jDialog.setSize(250,300);
        jDialog.setLocationRelativeTo(null);
        //实例化学生操作对像
        stuFrame = new StuFrame();
        //设置学生操作界面按钮的名字
        stuFrame.getConfirm().setActionCommand("add");
        //注册按钮事件
        stuFrame.getConfirm().addActionListener(this);
        //添加学生操作界面
        jDialog.getContentPane().add(stuFrame.getPanel());

        //显示
        jDialog.setVisible(true);
    }


    //显示学生信息主界面
    private void showStu(){
        //创建内嵌框架
        jInternalFrame = new JInternalFrame("学生信息操作",true,true,true,true);

        //设置参数
        jInternalFrame.setSize(900,500);
        //关闭时隐藏界面
        jInternalFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        //取第一页码的数据
        queryData(1);

        //添加上中下 三个面板
        jInternalFrame.add(createPane(), BorderLayout.NORTH);
        jInternalFrame.add(new JScrollPane(jTable));
        jInternalFrame.add(createPagePanel(),BorderLayout.SOUTH);

        //把内嵌框架添加到桌面面板中
        jDesktopPane.add(jInternalFrame);
        //显示
        jInternalFrame.setVisible(true);
    }
    //取指定页码的数据  1:页码
    private void queryData(int jumpPage){
        //构造分页对像  1:总记录数 2：每页码显示的条数
        pageBean = new PageBean(stuDao.queryStuCount(),5);
        //处理页码
        if(jumpPage<=1){
            pageBean.setCurPage(1);
        }else if(jumpPage>=pageBean.getMaxPage()){
            pageBean.setCurPage(pageBean.getMaxPage());
        }else{
            pageBean.setCurPage(jumpPage);
        }
        //分页取数据
        Vector v = stuDao.queryStuPage(pageBean.getCurPage(),pageBean.getRowsPrePage()) ;
        //构造表格中的列名
        Vector col = new Vector();
        col.addElement("学号");
        col.addElement("姓名");
        col.addElement("年龄");
        col.addElement("电话");
        col.addElement("地址");
        //设置数据和列名
        model.setDataVector(v,col);
        //重新加载表格
        jTable.revalidate();

        //设置页码信息
        curPage.setText(pageBean.getCurPage()+"");
        rowsPrePage.setText(pageBean.getRowsPrePage()+"");
        maxPage.setText(pageBean.getMaxPage()+"");
        maxCount.setText(pageBean.getMaxCount()+"");

    }


    //创建分页面板
    private JPanel createPagePanel(){
        //创建面板
        JPanel pagePanel = new JPanel();
        //设置title
        pagePanel.setBorder(BorderFactory.createTitledBorder("分页信息"));
        //添加标签
        pagePanel.add(new JLabel("当前页码:"));
        pagePanel.add(curPage);
        pagePanel.add(new JLabel("总页码:"));
        pagePanel.add(maxPage);
        pagePanel.add(new JLabel("每页码显示:"));
        pagePanel.add(rowsPrePage);
        pagePanel.add(new JLabel("总条数:"));
        pagePanel.add(maxCount);
        //分页按钮
        JButton first = new JButton("首页");
        JButton previous = new JButton("上一页");
        JButton next = new JButton("下一页");
        JButton last = new JButton("尾页");
        //给分页按钮设置名字
        first.setActionCommand("first");
        previous.setActionCommand("previous");
        next.setActionCommand("next");
        last.setActionCommand("last");
        //给分页按钮注册事件
        first.addActionListener(this);
        previous.addActionListener(this);
        next.addActionListener(this);
        last.addActionListener(this);
        //把分页按钮添加到面板中
        pagePanel.add(first);
        pagePanel.add(previous);
        pagePanel.add(next);
        pagePanel.add(last);

        return pagePanel;
    }
    //添加、删除学生信息的面板
    private JPanel createPane(){
        JPanel panel = new JPanel();
        //设置title
        panel.setBorder(BorderFactory.createTitledBorder("操作"));
        //实例化添加、删除按钮
        addStu = new JButton("添加");
        delStu = new JButton("删除");

        //给按钮设置名字
        addStu.setActionCommand("addStu");
        delStu.setActionCommand("delStu");
        //注册事件
        addStu.addActionListener(this);
        delStu.addActionListener(this);

        //把按钮添加到面板中
        panel.add(addStu);
        panel.add(delStu);
        return panel;
    }
}
